home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / COPYSECS.M < prev    next >
Encoding:
Text File  |  1994-06-12  |  3.7 KB  |  168 lines

  1. MODULE CopySecs;
  2.  
  3. (*
  4.  * Kopiert einige Sektoren von einem auf ein anderes Laufwerk.
  5.  *)
  6.  
  7. (*$E MOS*)
  8. IMPORT GEMDOSIO;
  9.  
  10. FROM Storage IMPORT ALLOCATE;
  11.  
  12. FROM SYSTEM IMPORT ADR, ADDRESS;
  13.  
  14. FROM SysUtil0 IMPORT VarEqual;
  15.  
  16. FROM BIOS IMPORT DriveMap, DriveSet, RWAbs, BPB, BPBPtr, RW, GetBPB;
  17.  
  18. FROM InOut IMPORT WriteString, WriteCard, WriteHex, WriteLn,
  19.         GotoXY, WritePg;
  20. IMPORT InOut;
  21.  
  22.  
  23. PROCEDURE drvno (c:CHAR): CARDINAL;
  24.   BEGIN
  25.     RETURN ORD (CAP (c)) - ORD ('A')
  26.   END drvno;
  27.  
  28. TYPE CharSet = SET OF CHAR;
  29.  
  30. VAR sd, dd: CHAR;
  31.     sn, dn: CARDINAL;
  32.     drives: DriveSet;
  33.     p: BPBPtr;
  34.     inf: ARRAY [0..31] OF BPB;
  35.     ch: CHAR;
  36.     l: LONGINT;
  37.     k, j, i, bufbls, dblno, sblno, restbls, bls: CARDINAL;
  38.     sec, pc: POINTER TO CARDINAL;
  39.  
  40.  
  41. PROCEDURE info (n: CARDINAL);
  42.   BEGIN
  43.     WriteString ('  Drive ');
  44.     WriteString (CHR (n + ORD ('A')));
  45.     WriteString (':');
  46.     WriteLn;
  47.     WriteString ('  Sector Size: ');
  48.     WriteCard (inf[n].clsizb,0);
  49.     WriteString (' Byte');
  50.     WriteLn;
  51.     WriteString ('  No. of Sectors: ');
  52.     WriteCard (inf [n].numcl,0);
  53.     WriteLn;
  54.   END info;
  55.  
  56.  
  57. BEGIN
  58.   drives:= DriveMap ();
  59.   WriteLn;
  60.   WriteString ('Copy sectors');
  61.   WriteLn;
  62.   WriteString ('------------');
  63.   WriteLn;
  64.   
  65.   WriteString ('Source drive      (C-P)? ');
  66.   InOut.Read (sd); sd:= CAP (sd);
  67.   IF NOT ( sd IN CharSet {'C'..'P'} ) THEN RETURN END;
  68.   IF NOT ( drvno (sd) IN drives ) THEN RETURN END;
  69.   WriteLn;
  70.   
  71.   WriteString ('Destination drive (C-P)? ');
  72.   InOut.Read (dd); dd:= CAP (dd);
  73.   IF NOT ( dd IN CharSet {'C'..'P'} ) THEN RETURN END;
  74.   IF NOT ( drvno (dd) IN drives ) THEN RETURN END;
  75.   WriteLn;
  76.   
  77.   (*IF sd = dd THEN RETURN END;*)
  78.   sn:= drvno (sd);
  79.   dn:= drvno (dd);
  80.   
  81.   p:= GetBPB (sn);
  82.   IF p = NIL THEN WriteString ('Not online'); InOut.Read (ch); RETURN END;
  83.   inf[sn]:= p^;
  84.   
  85.   p:= GetBPB (dn);
  86.   IF p = NIL THEN WriteString ('Not online'); InOut.Read (ch); RETURN END;
  87.   inf[dn]:= p^;
  88.  
  89.   WriteLn;
  90.   WriteString ('Source drive: ');
  91.   WriteLn;
  92.   info (sn);
  93.  
  94.   WriteLn;
  95.   WriteString ('Dest drive: ');
  96.   WriteLn;
  97.   info (dn);
  98.   
  99.   IF inf[sn].clsizb # inf[dn].clsizb THEN
  100.     WriteString ('Both drives must have identical cluster size!');
  101.     InOut.Read (ch);
  102.     RETURN
  103.   END;
  104.  
  105.   ALLOCATE (sec, inf[sn].clsizb+2);
  106.   
  107.   WriteLn;
  108.   WriteString ('Source start (logical sector)? ');
  109.   InOut.ReadCard (sblno);
  110.  
  111.   WriteString ('Destination start (logical sector)? ');
  112.   InOut.ReadCard (dblno);
  113.   
  114.   WriteString ('No of sectors? ');
  115.   InOut.ReadCard (bls);
  116.   
  117.   pc:= ADDRESS (sec) + LONG (inf[sn].clsizb);
  118.   pc^:= $1234;
  119.   
  120.   FOR i:= 1 TO bls DO
  121.     GotoXY (0, 20);
  122.     WriteString ('Block: ');
  123.     WriteCard (sblno,5);
  124.     WriteString ('  -> ');
  125.     WriteCard (dblno,5);
  126.     WriteLn;
  127.     l:= RWAbs (Read, sec, 1, sblno, sn);
  128.     IF l # 0L THEN
  129.       WriteLn; WriteString ('Read error!');
  130.       InOut.Read (ch);
  131.       RETURN
  132.     END;
  133.     pc:= sec;
  134.     FOR j:= 1 TO 30 DO
  135.       IF (j MOD 10) # 1 THEN
  136.         WriteString (' ');
  137.       ELSE
  138.         WriteString (' ');
  139.       END;
  140.       WriteHex (pc^, 5);
  141.       IF (j MOD 10) = 0 THEN
  142.         (*
  143.           pb:= ADDRESS(pc) - 20;
  144.           WriteString (' ');
  145.           FOR k:= 1 TO 10 DO
  146.             
  147.           END;
  148.         *)
  149.         WriteLn;
  150.       END;
  151.       INC (pc, 2);
  152.     END;
  153.     InOut.Read (ch);
  154.     IF ch = CHR(27) THEN RETURN END;
  155.     l:= RWAbs (Write, sec, 1, dblno, dn);
  156.     IF l # 0L THEN
  157.       WriteLn; WriteString ('Write error!');
  158.       InOut.Read (ch);
  159.       RETURN
  160.     END;
  161.     INC (sblno);
  162.     INC (dblno)
  163.   END;
  164.   WriteLn;
  165.   WriteString ("OK.");
  166.   InOut.Read (ch);
  167. END CopySecs.
  168.